1 /* Copyright 2002-2016 CS Systèmes d'Information
2 * Licensed to CS Systèmes d'Information (CS) under one or more
3 * contributor license agreements. See the NOTICE file distributed with
4 * this work for additional information regarding copyright ownership.
5 * CS licenses this file to You under the Apache License, Version 2.0
6 * (the "License"); you may not use this file except in compliance with
7 * the License. You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
17 package org.orekit.propagation.semianalytical.dsst.utilities;
18
19 import java.util.TreeMap;
20
21 import org.orekit.propagation.semianalytical.dsst.utilities.CoefficientsFactory.NSKey;
22
23 /** Compute the L<sub>n</sub><sup>s</sup>(γ).
24 * <p>
25 * The fomula used is: <br>
26 * L<sub>n</sub><sup>s</sup>(γ) = ( R / a )<sup>n</sup>V<sub>ns</sub>Q<sup>ns</sup>(γ)
27 * </p>
28 * @author Lucian Barbulescu
29 */
30 public class LnsCoefficients {
31
32 /** The coefficients L<sub>n</sub><sup>s</sup>(γ). */
33 private final double[][] lns;
34
35 /** The coefficients dL<sub>n</sub><sup>s</sup>(γ) / dγ. */
36 private final double[][] dlns;
37
38 /** Create a set of L<sub>n</sub><sup>s</sup>(γ) coefficients.
39 *
40 * @param nMax maximum value for n
41 * @param sMax maximum value for s
42 * @param Qns the Q<sup>ns</sup>(γ) coefficients
43 * @param Vns the V<sub>ns</sub> coefficients
44 * @param roa (R / a)
45 */
46 public LnsCoefficients(final int nMax, final int sMax,
47 final double[][] Qns, final TreeMap<NSKey, Double> Vns, final double roa) {
48 final int rows = nMax + 1;
49 final int columns = sMax + 1;
50 this.lns = new double[rows][columns];
51 this.dlns = new double[rows][columns];
52
53 final double[] roaPow = new double[rows];
54 roaPow[0] = 1.;
55 for (int i = 1; i <= nMax; i++) {
56 roaPow[i] = roa * roaPow[i - 1];
57 }
58 for (int s = 0; s <= sMax; s++) {
59 for (int n = s; n <= nMax; n++) {
60 // if (n - s) is not even L<sub>n</sub><sup>s</sup>(γ) is 0
61 if ((n - s) % 2 == 0) {
62 final double coef = roaPow[n] * Vns.get(new NSKey(n, s));
63 lns[n][s] = coef * Qns[n][s];
64 if ( n == s) {
65 // if n == s the derivative is 0 because Q[n][s+1] == Q[n][n+1] is 0
66 dlns[n][s] = 0;
67 } else {
68 dlns[n][s] = coef * Qns[n][s + 1];
69 }
70 } else {
71 lns[n][s] = 0.;
72 dlns[n][s] = 0;
73 }
74 }
75 }
76
77 }
78
79 /**Get the value of L<sub>n</sub><sup>s</sup>(γ).
80 *
81 * @param n n index
82 * @param s s index
83 * @return L<sub>n</sub><sup>s</sup>(γ)
84 */
85 public double getLns(final int n, final int s) {
86 return lns[n][s];
87 }
88
89 /**Get the value of dL<sub>n</sub><sup>s</sup> / dγ (γ).
90 *
91 * @param n n index
92 * @param s s index
93 * @return L<sub>n</sub><sup>s</sup>(γ)
94 */
95 public double getdLnsdGamma(final int n, final int s) {
96 return dlns[n][s];
97 }
98 }